import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:hkzf_flutter/dio/user_info.dart';
import 'package:hkzf_flutter/utils/dio_http.dart';
import 'package:hkzf_flutter/utils/public.dart';
import 'package:hkzf_flutter/utils/store.dart';
import 'package:scoped_model/scoped_model.dart';

// 权限信息状态管理(主要是登录信息),用于全局状态管理
class AuthModel extends Model { 
    String _token = '';// 登录的token信息
    UserInfo? _userInfo;

    // 获取token
    String get token => _token;
    // 获取用户信息
    UserInfo? get userInfo => _userInfo;

    // 是否已经登录
    bool get isLogin => _token is String && _token != '';


    // 通过网络接口获取当前登录的用户信息
    _getUserInfo(BuildContext context) async{
      var path = '/user';
      var res = await DioHttp.of(context).get(path,null,_token);
      var resMap = json.decode(res.toString());
      print('用户信息：${resMap}');
      var data = resMap['body'];
      var userInfo = UserInfo.fromJson(data);
      _userInfo = userInfo;
      // 通知所有监听者更新组件
      notifyListeners();
    }
    // 初始化判断本地是否存在登录的token信息
    void initApp(BuildContext context) async {
      Store store = await Store.getInstance();
      String token = await store.getString(StoreKeys.token);
      // 本地存储的token信息不为空
      print('初始化判断本地存储token: $token');
      if(!isNullOrEmpty(token)){
        // 如果存在token，则说明已经登录
        login(token,context);
      }
    }
     // 刷新页面获取登录信息
    void freshAuthApp(BuildContext context) async {
      Store store = await Store.getInstance();
      String token = await store.getString(StoreKeys.token);
      // 本地存储的token信息不为空，并且用户信息为空的情况
      print('刷新判断本地存储token: $token');
      if(!isNullOrEmpty(token)&& isNullOrEmpty(userInfo)){
        // 如果存在token，则说明已经登录
        login(token,context);
      }
    }

    // 登录逻辑相关信息处理
    void login(String token,BuildContext context){
      _token = token;
      _getUserInfo(context);
    }
    // 登出逻辑
    void logout() async{
      // 清空状态存储中的信息
      _token = '';
      _userInfo = null;
      // 置空本地存储中的token信息
      Store store = await Store.getInstance();
      store.setString(StoreKeys.token,"");
      notifyListeners();
    }
    

}